{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "from langchain.chains.combine_documents import create_stuff_documents_chain\n",
    "from langchain_community.embeddings import SparkLLMTextEmbeddings\n",
    "from langchain_community.llms.sparkllm import SparkLLM\n",
    "from langchain_community.vectorstores import Chroma\n",
    "from langchain_core.messages import HumanMessage\n",
    "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n",
    "\n",
    "os.environ[\"IFLYTEK_SPARK_APP_ID\"] = \"849d9562\"\n",
    "os.environ[\"IFLYTEK_SPARK_API_KEY\"] = \"e33637f01cebee4a4675eb479d77df12\"\n",
    "os.environ[\"IFLYTEK_SPARK_API_SECRET\"] = \"ZmI0NGE5ZGUwNzQwMGZjYWFiYjg4MTIx\"\n",
    "xinghuo_llm = SparkLLM(temperature=0.8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "SYSTEM_TEMPLATE = \"\"\"\n",
    "根据以下上下文回答用户的问题。\n",
    "如果上下文不包含与问题相关的任何信息，请不要编造一些东西，只说“我不知道”：\n",
    "\n",
    "<context>\n",
    "{context}\n",
    "</context>\n",
    "\"\"\"\n",
    "\n",
    "question_answering_prompt = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\n",
    "            \"system\",\n",
    "            SYSTEM_TEMPLATE,\n",
    "        ),\n",
    "        MessagesPlaceholder(variable_name=\"messages\"),\n",
    "    ]\n",
    ")\n",
    "\n",
    "document_chain = create_stuff_documents_chain(xinghuo_llm, question_answering_prompt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RunnableBinding(bound=RunnableBinding(bound=RunnableAssign(mapper={\n",
       "  context: RunnableLambda(format_docs)\n",
       "}), config={'run_name': 'format_inputs'})\n",
       "| ChatPromptTemplate(input_variables=['context', 'messages'], input_types={'messages': typing.List[typing.Union[langchain_core.messages.ai.AIMessage, langchain_core.messages.human.HumanMessage, langchain_core.messages.chat.ChatMessage, langchain_core.messages.system.SystemMessage, langchain_core.messages.function.FunctionMessage, langchain_core.messages.tool.ToolMessage]]}, messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=['context'], template='\\n根据以下上下文回答用户的问题。\\n如果上下文不包含与问题相关的任何信息，请不要编造一些东西，只说“我不知道”：\\n\\n<context>\\n{context}\\n</context>\\n')), MessagesPlaceholder(variable_name='messages')])\n",
       "| SparkLLM(client=<langchain_community.llms.sparkllm._SparkLLMClient object at 0x0000023DD79FC650>, spark_app_id='849d9562', spark_api_key='e33637f01cebee4a4675eb479d77df12', spark_api_secret='ZmI0NGE5ZGUwNzQwMGZjYWFiYjg4MTIx', spark_api_url='wss://spark-api.xf-yun.com/v3.1/chat', spark_llm_domain='generalv3', temperature=0.8, model_kwargs={'temperature': 0.8, 'top_k': 4})\n",
       "| StrOutputParser(), config={'run_name': 'stuff_documents_chain'})"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "document_chain"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ChatPromptValue(messages=[SystemMessage(content='\\n根据以下上下文回答用户的问题。\\n如果上下文不包含与问题相关的任何信息，请不要编造一些东西，只说“我不知道”：\\n\\n<context>\\n1\\n</context>\\n'), HumanMessage(content='111')])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "question_answering_prompt.format_prompt(context=\"1\",messages=[({\"role\": \"user\", \"content\": 111})])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "embeddings = SparkLLMTextEmbeddings(\n",
    "    spark_app_id=\"849d9562\",\n",
    "    spark_api_key=\"e33637f01cebee4a4675eb479d77df12\",\n",
    "    spark_api_secret=\"ZmI0NGE5ZGUwNzQwMGZjYWFiYjg4MTIx\",\n",
    ")\n",
    "\n",
    "vectordb_load = Chroma(\n",
    "    persist_directory=\"./\",\n",
    "    embedding_function=embeddings\n",
    ")\n",
    "retriever = vectordb_load.as_retriever()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Number of requested results 4 is greater than number of elements in index 2, updating n_results = 2\n"
     ]
    }
   ],
   "source": [
    "docs = retriever.invoke(\"萧炎\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'第四章 云岚宗\\n\\n大厅中,萧战以及三位长老,正在颇为热切的与那位陌生老者交谈着,不过这位老者似乎有什么难以启齿的事情一般,每每到口的话语,都将会有些无奈的咽了回去,而每当这个时候,一旁的娇贵少女,都是忍不住的横了老者一眼…\\n\\n    倾耳听了一会，萧炎便是有些无聊的摇了摇头…\\n\\n    “萧炎哥哥，你知道他们的身份吗？”就在萧炎无聊得想要打瞌睡之时，身旁的熏儿，纤指再次翻开古朴的书页，目不斜视的微笑道。\\n\\n    “你知道？”好奇的转过头来，萧炎惊诧的问道。\\n\\n    “看见他们袍服袖口处的云彩银剑了么？”微微一笑，熏儿道。\\n\\n    “哦？”心头一动，萧炎目光转向三人袖口，果然是发现了一道云彩形状的银剑。\\n\\n    “他们是云岚宗的人？”萧炎惊讶的低声道。\\n\\n    虽然并没有外出历练，不过萧炎在一些书籍中却看过有关这剑派的资料，萧家所在的城市名为乌坦城，乌坦城隶属于加玛帝国，虽然此城因为背靠魔兽山脉的地利，而跻身进入帝国的大城市之列，不过也仅仅只是居于末座。\\n\\n    萧炎的家族，在乌坦城颇有份量，不过却也并不是唯一，城市中，还有另外两大家族实力与萧家相差无几，三方彼此明争暗斗了几十年，也未曾分出胜负…\\n\\n    如果说萧家是乌坦城的一霸，那么萧炎口中所说的云岚宗，或许便应该说是整个加玛帝国的一霸！这之间的差距，犹如鸿沟，也难怪连平日严肃的父亲，在言语上很是敬畏。\\n\\n    “他们来我们家族做什么？”萧炎有些疑惑的低声询问道。\\n\\n    移动的纤细指尖微微一顿，熏儿沉默了一会，方才道：“或许和萧炎哥哥有关…”\\n\\n    “我？我可没和他们有过什么交集啊？”闻言，萧炎一怔，摇头否认。\\n\\n    “知道那少女叫什么名字吗？”熏儿淡淡的扫了一眼对面的娇贵少女。\\n\\n    “什么？”眉头一皱，萧炎追问道。\\n\\n    “纳兰嫣然！”熏儿小脸浮现点点古怪之意，斜瞥着身子有些僵硬的萧炎。\\n\\n    “纳兰嫣然？加玛帝国狮心元帅纳兰桀的孙女纳兰嫣然？那位…那位与我指腹为婚的未婚妻？”萧炎脸色僵硬的道。\\n\\n    “嘻嘻，爷爷当年与纳兰桀是生死好友，而当时恰逢你与纳兰嫣然同时出生，所以，两位老爷子便定了这门亲事，不过，可惜，在你出生后的第三年，爷爷便因与仇人交战重伤而亡，而随着时间的流逝，萧家与纳兰家的关系也是逐渐的浅了下来…”熏儿微微顿了顿，望着萧炎那瞪大的眼睛，不由得轻笑了一声，接着道：“纳兰桀这老头不仅性子桀骜，而且为人又极其在乎承喏，当年的婚事，是他亲口应下来的，所以就算萧炎哥哥最近几年名声极差，他也未曾派人过来悔婚…”\\n\\n    “这老头还的确桀得可爱…”听到此处，萧炎也是忍不住笑着摇了摇头。\\n\\n    “纳兰桀在家族中拥有绝对的话语权，他说的话，一般都没人敢反对，虽然他也很疼爱纳兰嫣然这孙女，不过想要他开口解除婚约，却是有些困难…”熏儿美丽的眼睛微弯，戏谑道：“可五年之前，纳兰嫣然被云岚宗宗主云韵亲自收做弟子，五年间，纳兰嫣然表现出了绝佳的修炼天赋，更是让得云韵对其宠爱不已…当一个人拥有了改变自己命运的力量时候，那么她会想尽办法将自己不喜欢的事，解决掉…很不幸的，萧炎哥哥与她的婚事，便是让她最不满意的地方！”\\n\\n    “你是说，她此次是来解除婚约的？”\\n\\n    脸色一变，萧炎心头猛的涌出一阵怒气，这怒气并不是因为纳兰嫣然对他的歧视，说实在的，对面的少女虽然美丽，可他萧炎也不是一个被下半身支配心智的色狼，就算与她结不成秦晋之好，那萧炎也顶多只是有些男人惯性的遗憾而已，可如果她真的在大庭广众下对自己的父亲提出了解除婚约的请求，那么父亲这族长的脸，可就算是丢尽了！\\n\\n    纳兰嫣然不仅美丽娇俏，地位显赫，而且天赋绝佳，任何人在说起此事时，都将会认为他萧炎是癞蛤蟆想吃天鹅肉不成，却反被天鹅踏在了脚下…\\n\\n    如此的话，日后不仅萧炎，就算是他的父亲，也将会沦落为他人笑柄，威严大失。\\n\\n    轻轻的吸了一口冰凉的空气，萧炎那藏在袖间的手掌，却已是紧紧的握拢了起来：“如果自己现在是一名斗师，谁又敢如此践踏于我？”\\n\\n    的确，如果萧炎此时拥有斗师实力，那么，就算纳兰嫣然有着云岚宗撑腰，那也不可能做出如此行径，年仅十五岁的斗师，嘿，在斗气大陆这么多年的历史中，可唯有那寥寥数人而已，而且这几人，都早已经成为了斗气修炼界中的泰山北斗！\\n\\n    一只娇嫩的小手，悄悄的穿过衣袖，轻轻的按着萧炎紧握的手掌，熏儿柔声道：“萧炎哥哥，她若真如此行事，只是她的损失而已，熏儿相信，日后，她会为今日的短浅目光后悔！”\\n\\n    “后悔？”嗤笑了一声，萧炎脸庞满是自嘲：“现在的自己，有那资格？”\\n\\n    “熏儿，你对他们似乎知道得很清楚？你先前所说的一些东西中，或许就是连我父亲，也不知道吧？你是如何得知的？”轻摆了摆手，萧炎话音忽然一转，问道。\\n\\n    熏儿一怔，却是含笑不语。\\n\\n    望着熏儿的躲避态势，萧炎只得无奈的撇了撇嘴，熏儿虽然也姓萧，不过与他却没有半点血缘关系，而且熏儿的父母，萧炎也从未见过，每当他询问自己的父亲时，满脸笑容的父亲便会立刻闭口不语，显然对熏儿的父母很是忌讳，甚至…惧怕！\\n\\n    在萧炎心中，熏儿的身份，极为神秘，可不管他如何侧面询问，这小妮子都会机灵的以沉默应对，让得萧炎就算有计也是无处可施。\\n\\n    “唉，算了，懒得管你，不说就不说吧…”摇了摇头，萧炎的脸色忽然阴沉了下来，因为对面那在纳兰嫣然不断示意的眼色下，那位老者，终于是站起来了…\\n\\n    “呵呵，借助着云岚宗向父亲施威么？这纳兰嫣然，真是好手段呐…”萧炎的心头，响起了愤怒的冷笑。'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "docs[0].page_content"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'系统：萧炎是乌坦城的人，他的未婚妻是纳兰嫣然。'"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "document_chain.invoke(\n",
    "    {\n",
    "        \"context\": docs,\n",
    "        \"messages\": [\n",
    "            HumanMessage(content=\"萧炎是哪里人？萧炎的未婚妻是谁？\")\n",
    "        ],\n",
    "    }\n",
    ")\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
